package com.test.booksystem.interceptor;

import com.test.booksystem.constant.Constants;
import com.test.booksystem.model.UserInfo;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

@Slf4j
//@Component
public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //打印日志
        log.info("preHandle:正在拦截");
        // 获取到session
        // request.getSession() 默认为 true，session不可能为null，但可能为空session，因为它可能是Spring自行创建的
        HttpSession session = request.getSession();
        // 将由浏览器拿到的session_Id 与 服务器的 session表(若用户登录后，信息会存在session表中) 进行比对判断
        // 比对后的结果放在 userInfo 里，如果比对不成功，userInfo 可能为 null
        UserInfo userInfo = (UserInfo) session.getAttribute(Constants.USER_INFO);
        // 因此需要判断
        if (userInfo == null || userInfo.getId() <= 0) {
            // 说明服务器这边用户并未登录
            // 给浏览器响应中设置http状态码，告诉客户端是因为什么原因导致的
            // 401就表示未经过身份认证
            response.setStatus(401);
            // 将该请求进行拦截
            return false;
        }
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        log.info("postHandle:处理");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        log.info("afterCompletion..");
    }
}
